import plugin from '../../lib/plugins/plugin.js';
import { segment } from "oicq";
import fs from "fs"
import path from "path"
const __dirname = path.resolve();

const settings = {
  // 语音文件存放路径
  path: path.join(__dirname, "/resources/voice"),
  // 语音目录的语言名称，因为群文件压缩包里的中文语音目录叫：China，如果你不想修改文件夹名称的话，可以将此处的配置改为China
  keys: ["Chinese", "English", "Japanese", "Korean"],
}

export class guessVoice extends plugin {
  constructor() {
    super({
      /** 功能名称 */
      name: '猜语音',
      /** 功能描述 */
      dsc: '猜语音',
      /** https://oicqjs.github.io/oicq/#events */
      event: 'message',
      /** 优先级，数字越小等级越高 */
      priority: 5000,
      rule: [
        {
          /** 命令正则匹配 */
          reg: "^#猜语音(.*)$",  //匹配消息正则，命令正则
          /** 执行方法 */
          fnc: 'guessVoice'
        },
        {
          /** 命令正则匹配 */
          reg: "^#(.+)语音(.*)$",  //匹配消息正则，命令正则
          /** 执行方法 */
          fnc: 'playVoice'
        },
        {
          /** 命令正则匹配 */
          reg: "(.*)",  //匹配消息正则，命令正则
          /** 执行方法 */
          fnc: 'guessVoiceCheck',
          log: false
        }
      ]
    })
  }

  async playVoice(e) {
    let splitArr = e.msg.split('语音')
    let language = languageConfig[0]
    if (splitArr.length >= 2) {
      language = getLanguage(splitArr[1])
      if (language == null) {
        e.reply(`没有找到语言为“${splitArr[1]}”的语音`)
        return true;
      }
    }
    let name = splitArr[0].substring(1, splitArr[0].length)
    randomPlayVoice(e, name, language)
    return true;
  }

  async guessVoice(e) {
    let guessConfig = getGuessConfig(e)
    if (guessConfig.gameing) {
      e.reply('猜语音游戏正在进行哦')
      return true;
    }
    let splitArr = e.msg.split('语音')
    let language = languageConfig[0]
    if (splitArr.length >= 2) {
      language = getLanguage(splitArr[1])
      if (language == null) {
        e.reply(`没有找到语言为“${splitArr[1]}”的语音`)
        return true;
      }
    }
    // 随机角色名
    let langPath = path.join(settings.path, language.key);
    let nameList = [];
    fs.readdirSync(langPath).forEach(fileName => nameList.push(fileName))
    let name = nameList[Math.round(Math.random() * (nameList.length - 1))]
    e.reply('即将发送一段语音，30秒之后揭晓答案')
    guessConfig.gameing = true
    guessConfig.current = null
    console.group("猜语音")
    console.log('角色：', name)
    console.log('语言:', language.name)
    console.groupEnd()
    setTimeout(() => {
      guessConfig.current = name
  
      randomPlayVoice(e, name, language)
      guessConfig.timer = setTimeout(() => {
        if (guessConfig.gameing) {
          guessConfig.gameing = false
          e.reply('很遗憾，还没有人答对哦，正确答案是：' + guessConfig.current)
        }
      }, 30000)
    }, 1500)
  
    return true;
  }

  async guessVoiceCheck(e) {
    let msg = e.original_msg || ''
    if (!msg) {
      return false
    }
    let guessConfig = getGuessConfig(e)
    let { gameing, current } = guessConfig
    let answer = roleIdToName(current.trim())
    let id = roleIdToName(e.msg.trim())
    if (gameing && answer == id) {
      e.reply(['恭喜你答对了！'], true)
      guessConfig.gameing = false
      clearTimeout(guessConfig.timer)
      return true
    }
    return false
  }
} 

const languageConfig = [
  {
    key: settings.keys[0],
    name: "中文",
    alias: ['中', '中文', '汉', '汉语', '中配', settings.keys[0]],
  },
  {
    key: settings.keys[1],
    name: "英语",
    alias: ['英', '英文', '英语', '英配', settings.keys[1]],
  },
  {
    key: settings.keys[2],
    name: "日语",
    alias: ['日', '日文', '日语', '日配', settings.keys[2]],
  },
  {
    key: settings.keys[3],
    name: "韩语",
    alias: ['韩', '韩文', '韩语', '韩配', settings.keys[3]],
  }
]

function getLanguage(name) {
  if (name == '' || name == null) {
    return languageConfig[0]
  }
  for (const item of languageConfig) {
    if (item.alias.find(a => a.toLowerCase() == name.toLowerCase())) {
      return item
    }
  }
  return null
}

function randomPlayVoice(e, name, language) {
  let voicePath = path.join(settings.path, language.key, name);
  let voiceFiles = [];
  if (fs.existsSync(voicePath)) {
    fs.readdirSync(voicePath).forEach(fileName => voiceFiles.push(fileName))
  } else {
    e.reply(`没有找到${name}的${language.name}语音哦！`)
    return true;
  }
  let randomFile = voiceFiles[Math.round(Math.random() * (voiceFiles.length - 1))]
  let finalPath = path.join(settings.path, language.key, name, randomFile);
  let bitMap = fs.readFileSync(finalPath);
  let base64 = Buffer.from(bitMap, 'binary').toString('base64');
  let message = segment.record(`base64://${base64}`);
  e.reply(message);
}

const guessConfigMap = new Map()

function getGuessConfig(e) {
  let key = e.message_type + e[e.isGroup ? 'group_id' : 'user_id']
  let config = guessConfigMap.get(key)
  if (config == null) {
    config = {
      gameing: false,
      current: '',
      timer: null,
      delete: () => guessConfigMap.delete(key),
    }
    guessConfigMap.set(key, config)
  }
  return config
}

let genshin = {}
let nameID = ''

//首位是官方默认名称
genshin.roleId = {
    10000003: ["琴", "Jean", "jean", "团长", "代理团长", "琴团长", "蒲公英骑士", "琴·古恩希尔德", "古恩希尔德"],
    10000006: ["丽莎", "Lisa", "lisa", "图书管理员", "图书馆管理员", "蔷薇魔女", "丽莎阿姨", "丽莎·敏兹", "敏兹"],
    10000005: ["空", "男主", "男主角", "龙哥", "空哥", "男爷"],
    10000007: ["荧", "女主", "女主角", "莹", "萤", "黄毛阿姨", "荧妹", "女爷"],
    20000000: ["主角", "旅行者", "卑鄙的外乡人", "荣誉骑士", "爷", "风主", "岩主", "雷主", "草主", "履刑者", "抽卡不歪真君"],
    10000014: ["芭芭拉", "Barbara", "barbara", "巴巴拉", "拉粑粑", "拉巴巴", "内鬼", "加湿器", "肉身解咒", "肉身解咒真君", "闪耀偶像", "偶像", "芭芭拉·佩奇", "佩奇"],
    10000015: ["凯亚", "Kaeya", "kaeya", "盖亚", "凯子哥", "凯鸭", "矿工", "矿工头子", "骑兵队长", "凯子", "凝冰渡海真君", "凯亚·亚尔伯里奇", "亚尔伯里奇"],
    10000016: ["迪卢克", "diluc", "Diluc", "卢姥爷", "姥爷", "卢老爷", "卢锅巴", "正义人", "正e人", "正E人", "卢本伟", "暗夜英雄", "卢卢伯爵", "落魄了", "落魄了家人们", "迪卢克·莱艮芬德", "莱艮芬德"],
    10000020: ["雷泽", "razor", "Razor", "狼少年", "狼崽子", "狼崽", "卢皮卡", "小狼", "小狼狗", "狼孩"],
    10000021: ["安柏", "Amber", "amber", "安伯", "兔兔伯爵", "飞行冠军", "侦查骑士", "点火姬", "点火机", "打火机", "打火姬"],
    10000022: ["温迪", "Venti", "venti", "温蒂", "风神", "卖唱的", "巴巴托斯", "巴巴脱丝", "芭芭托斯", "芭芭脱丝", "干点正事", "不干正事", "吟游诗人", "诶嘿", "唉嘿", "摸鱼"],
    10000023: ["香菱", "Xiangling", "xiangling", "香玲", "锅巴", "厨师", "万民堂厨师", "香师傅", "卯香菱"],
    10000024: ["北斗", "Beidou", "beidou", "大姐头", "大姐", "无冕的龙王", "龙王"],
    10000025: ["行秋", "Xingqiu", "xingqiu", "秋秋人", "秋妹妹", "书呆子", "水神", "飞云商会二少爷"],
    10000026: ["魈", "Xiao", "xiao", "打桩机", "插秧", "三眼五显仙人", "三眼五显真人", "降魔大圣", "护法夜叉", "快乐风男", "无聊", "靖妖傩舞", "矮子仙人", "三点五尺仙人", "跳跳虎"],
    10000027: ["凝光", "Ningguang", "ningguang", "富婆", "天权星", "天权"],
    10000029: ["可莉", "Klee", "klee", "嘟嘟可", "火花骑士", "蹦蹦炸弹", "炸鱼", "放火烧山", "放火烧山真君", "蒙德最强战力", "逃跑的太阳", "啦啦啦", "哒哒哒", "炸弹人", "禁闭室", "太阳", "小太阳"],
    10000030: ["钟离", "Zhongli", "zhongli", "摩拉克斯", "岩王爷", "岩神", "钟师傅", "天动万象", "岩王帝君", "未来可期", "帝君", "拒收病婿"],
    10000031: ["菲谢尔", "Fischl", "fischl", "皇女", "小艾米", "小艾咪", "奥兹", "断罪皇女", "中二病", "中二少女", "中二皇女", "奥兹发射器", "菲谢尔·冯·露弗施洛斯·那菲多特", "露弗施洛斯", "那菲多特"],
    10000032: ["班尼特", "Bennett", "bennett", "点赞哥", "点赞", "倒霉少年", "倒霉蛋", "霹雳闪雷真君", "班神", "班爷", "倒霉", "火神", "六星真神"],
    10000033: ["达达利亚", "Tartaglia", "tartaglia", "Childe", "childe", "Ajax", "ajax", "达达鸭", "达达利鸭", "公子", "玩具销售员", "玩具推销员", "钱包", "鸭鸭", "愚人众末席", "阿贾克斯"],
    10000034: ["诺艾尔", "Noelle", "noelle", "女仆", "高达", "岩王帝姬"],
    10000035: ["七七", "Qiqi", "qiqi", "僵尸", "肚饿真君", "度厄真君", "77"],
    10000036: ["重云", "Chongyun", "chongyun", "纯阳之体", "冰棍"],
    10000037: ["甘雨", "Ganyu", "ganyu", "椰羊", "椰奶", "王小美"],
    10000038: ["阿贝多", "Albedo", "albedo", "可莉哥哥", "升降机", "升降台", "电梯", "白垩之子", "贝爷", "白垩", "阿贝少", "花呗多", "阿贝夕", "abd", "阿师傅"],
    10000039: ["迪奥娜", "Diona", "diona", "迪欧娜", "dio", "dio娜", "冰猫", "猫猫", "猫娘", "喵喵", "调酒师", "迪奥娜·凯茨莱茵", "凯茨莱茵"],
    10000041: ["莫娜", "Mona", "mona", "穷鬼", "穷光蛋", "穷", "莫纳", "占星术士", "占星师", "讨龙真君", "半部讨龙真君", "阿斯托洛吉斯·莫娜·梅姬斯图斯", "阿斯托洛吉斯", "梅姬斯图斯", "梅姬斯图斯姬"],
    10000042: ["刻晴", "Keqing", "keqing", "刻情", "氪晴", "刻师傅", "刻师父", "牛杂", "牛杂师傅", "斩尽牛杂", "免疫", "免疫免疫", "屁斜剑法", "玉衡星", "玉衡", "阿晴", "啊晴", "璃月雷神"],
    10000043: ["砂糖", "Sucrose", "sucrose", "雷莹术士", "雷萤术士", "雷荧术士"],
    10000044: ["辛焱", "Xinyan", "xinyan", "辛炎", "黑妹", "摇滚"],
    10000045: ["罗莎莉亚", "Rosaria", "rosaria", "罗莎莉娅", "白色史莱姆", "白史莱姆", "修女", "罗莎利亚", "罗莎利娅", "罗沙莉亚", "罗沙莉娅", "罗沙利亚", "罗沙利娅", "萝莎莉亚", "萝莎莉娅", "萝莎利亚", "萝莎利娅", "萝沙莉亚", "萝沙莉娅", "萝沙利亚", "萝沙利娅"],
    10000046: ["胡桃", "Hu Tao", "hu tao", "HuTao", "hutao", "Hutao", "胡淘", "往生堂堂主", "火化", "抬棺的", "蝴蝶", "核桃", "堂主", "胡堂主", "雪霁梅香", "桃子"],
    10000047: ["枫原万叶", "Kaedehara Kazuha", "Kazuha", "kazuha", "万叶", "叶天帝", "天帝", "叶师傅"],
    10000048: ["烟绯", "Yanfei", "yanfei", "烟老师", "律师", "罗翔"],
    10000051: ["优菈", "Eula", "eula", "优拉", "尤拉", "尤菈", "浪花骑士", "记仇", "优菈·劳伦斯", "劳伦斯"],

    //2.0
    10000002: ["神里绫华", "Kamisato Ayaka", "Ayaka", "ayaka", "神里", "绫华", "神里凌华", "凌华", "白鹭公主", "神里大小姐", "小乌龟", "龟龟"],
    10000049: ["宵宫", "Yoimiya", "yoimiya", "霄宫", "烟花", "肖宫", "肖工", "绷带女孩", "长野原宵宫"],
    10000052: ["雷电将军", "Raiden Shogun", "Raiden", "raiden", "雷神", "将军", "雷军", "巴尔", "阿影", "影", "巴尔泽布", "煮饭婆", "奶香一刀", "无想一刀", "宅女"],
    10000053: ["早柚", "Sayu", "sayu", "小狸猫", "狸猫", "忍者", "貉"],
    10000054: ["珊瑚宫心海", "Sangonomiya Kokomi", "Kokomi", "kokomi", "心海", "军师", "珊瑚宫", "书记", "观赏鱼", "水母", "鱼", "美人鱼"],
    10000056: ["九条裟罗", "Kujou Sara", "Sara", "sara", "九条", "九条沙罗", "裟罗", "沙罗", "天狗"],
    10000062: ["埃洛伊", "Aloy", "aloy"],
    10000050: ["托马", "Thoma", "thoma", "家政官", "太郎丸", "地头蛇", "男仆", "拖马"],
    10000055: ["五郎", "Gorou", "gorou", "柴犬", "土狗", "希娜", "希娜小姐"],
    10000057: ["荒泷一斗", "Arataki Itto", "Itto", "itto", "荒龙一斗", "荒泷天下第一斗", "一斗", "一抖", "荒泷", "1斗", "牛牛", "斗子哥", "牛子哥", "牛子", "孩子王", "斗虫", "巧乐兹", "放牛的"],
    10000058: ["八重神子", "Yae Miko", "Miko", "miko", "八重", "神子", "狐狸", "想得美哦", "巫女", "屑狐狸", "骚狐狸", "八重宫司", "婶子", "小八", "八重寄子", "寄子"],
    10000059: ["鹿野院平藏", "shikanoin heizou", "Heizou", "heizou", "heizo", "鹿野苑", "鹿野院", "平藏", "鹿野苑平藏", "小鹿"],
    10000060: ["夜兰", "Yelan", "yelan", "夜阑", "叶澜", "腋兰", "夜天后"],
    10000063: ["申鹤", "Shenhe", "shenhe", "神鹤", "小姨", "小姨子", "审鹤"],
    10000064: ["云堇", "Yun Jin", "yunjin", "yun jin", "云瑾", "云先生", "云锦", "神女劈观", "土女"],
    10000065: ["久岐忍", "Kuki Shinobu", "Kuki", "kuki", "Shinobu", "shinobu", "97忍", "小忍", "久歧忍", "97", "茄忍", "茄子", "紫茄子", "阿忍", "忍姐"],
    10000066: ["神里绫人", "Kamisato Ayato", "Ayato", "ayato", "绫人", "神里凌人", "凌人", "0人", "神人", "零人", "大舅哥"],

    //3.0
    10000069: ["提纳里", "Tighnari", "tighnari", "提那里", "驴", "柯莱老师", "巡林官"],
    10000067: ["柯莱", "Collei", "collei", "柯来", "科莱", "科来", "小天使", "须弥安柏", "须弥飞行冠军", "见习巡林员", "巡林员"],
    10000068: ["多莉", "Dori", "dori", "多利", "多力"],

    //卫星角色
    10000000: [],
};

function roleIdToName(keyword, search_val = false) {
    if (!keyword) {
        return false
    }
    if (search_val) {
        if (genshin.roleId[keyword] && genshin.roleId[keyword][0]) {
            return genshin.roleId[keyword][0]
        } else {
            return ""
        }
    }

    if (!nameID) {
        nameID = new Map()
        for (let i in genshin.roleId) {
            for (let val of genshin.roleId[i]) {
                nameID.set(val, i)
            }
        }
    }
    let name = nameID.get(keyword)
    return name ? name : ""
}